package com.project.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.project.bean.LogBean;
import com.project.bean.UserBean;
import com.project.mapper.IGradeMapper;
import com.project.mapper.ILogMapper;
import com.project.mapper.IRoleMapper;
import com.project.mapper.IUserMapper;
import com.project.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDate;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

@Service
public class UserServiceImpl implements IUserService {
    @Autowired
    private IUserMapper userMapper;
    @Autowired
    private ILogMapper logMapper;
    @Autowired
    private IRoleMapper roleMapper;
    @Autowired
    private IGradeMapper gradeMapper;

    /**
     * 用户登陆，登陆成功返回登陆对象，并同时添加日志信息
     *
     * @param userName 用户名
     * @param pwd      密码
     * @return 登陆对象
     */
    @Override
    public UserBean login(String userName, String pwd) {
        QueryWrapper<UserBean> qw = new QueryWrapper<>();
        qw.eq("u_userName", userName);
        qw.eq("u_passWord", pwd);

        UserBean user = userMapper.selectOne(qw);

        if (user != null) {
            user.setRole(roleMapper.findRoles(user.getId()));
            user.setGrad(gradeMapper.findGrades(user.getId()));

            LogBean logBean = null;
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss", Locale.CHINA);
            LocalTime time = LocalTime.now();
            String f = formatter.format(time);
            String userLogin = user.getName() + "在" + " " + f + " " + "登录系统";
            System.out.println(userLogin);
            logMapper.insert(new LogBean(userLogin));
            return user;
        } else {
            return null;
        }
    }

    /**
     * 动态条件分页查询
     *
     * @param pageNo   页码
     * @param userName 用户名
     * @return 分页对象（编号、用户名、密码、真实姓名）
     */
    @Override
    public IPage<UserBean> findByItem(Integer pageNo, String userName) {
        return userMapper.findByItem(new Page(pageNo, 3), userName);
    }


    /**
     * 添加用户，同时添加用户所包含的角色数组
     * 先查询该用户名是否存在，存在false，不存在true
     *
     * @param user   用户对象
     * @param roleId 角色编号数组
     */
    @Override
    public boolean add(UserBean user, Integer[] roleId) {
        QueryWrapper<UserBean> qw = new QueryWrapper<>();
        qw.eq("u_name", user.getUserName());
        if (userMapper.selectOne(qw) == null) {
            userMapper.insert(user);
            userMapper.addRoles(user.getId(), roleId);
            return true;
        }
        return false;
    }

    /**
     * 根据用户id删除用户，
     * 先判断是否为登陆用户，如果是，删除失败，如果不是，先删除该用户对应的中间表信息，再进行用户表的删除
     *
     * @param id 用户编号
     * @UserBean 登陆用户
     */
    @Override
    public boolean del(Integer id, UserBean loginUser) {
        if (id == loginUser.getId()) {
            return false;
        } else {
            userMapper.deleteById(id);
        }
        return true;
    }

    /**
     * 根据用户id查询用户信息，同时查询用户拥有的权限角色集合
     *
     * @param id 用户编号
     * @return 用户对象
     */
    @Override
    public UserBean findById(Integer id) {
        UserBean user = userMapper.selectById(id);
        user.setRole(roleMapper.findRoles(user.getId()));
        user.setGrad(gradeMapper.findGrades(id));
        return user;

//        UserBean user =  userMapper.selectById(id);
//        user.setRole(roleMapper.findByUserId(id));
//        user.setGrad(gradeMapper.findByAll(id));
//        return user;
    }

    /**
     * 根据用户id修改用户的角色
     * 先将旧id数组删除，再添加新的数组
     *
     * @param userId 用户编号
     * @param roleId 角色数组
     */
    @Override
    public void updateRole(Integer userId, Integer[] roleId) {
        userMapper.updateRoles(userId, roleId);
    }

    /**
     * 按id修改密码
     *
     * @param userId 用户编号
     * @param pwd    新密码
     */
    @Override
    public void updatePwd(Integer userId, String pwd) {
        UserBean user = userMapper.selectById(userId);
        user.setPassWord(pwd);
        userMapper.updateById(user);
    }
}
